package pe.com.bbva.modpre.persistencia.hibernate;

import java.util.List;
import java.util.Map;

import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import pe.com.bbva.modpre.dominio.Rar;
import pe.com.bbva.modpre.dominio.Valor;
import pe.com.bbva.modpre.persistencia.RarDAO;
import pe.com.bbva.modpre.persistencia.ValorDAO;
import pe.com.bbva.modpre.utileria.Busqueda;
import pe.com.bbva.modpre.utileria.ModpreUtil;

@Repository
@SuppressWarnings("serial")
public class RarHibernate extends BaseHibernate<Rar, Long> 
implements RarDAO {
	
	@Autowired
	ValorDAO valorDAO;
	
	@Autowired
	public RarHibernate(SessionFactory sessionFactory){
		setSessionFactory(sessionFactory);
	}

	@Override
	public List<Rar> busquedaRar(Map<String,Object> map) {
		Busqueda filtro = Busqueda.forClass(Rar.class);
		filtro.createAlias("estado", "e");
		filtro.add(Restrictions.eq("e.codigo",Valor.CODIGO.ACTIVO));
		if(map!=null){
			Rar rar = new Rar();
			rar.setCodigoRar(ModpreUtil.convertirObjetoLong(map.get("codigoRar")));
			rar.setCodigoMoneda(ModpreUtil.convertirObjetoLong(map.get("codigoMoneda")));
			rar.setCodigoGrupoProducto(ModpreUtil.convertirObjetoLong(map.get("codigoGrupoProducto")));
			rar.setCodigoMonto(ModpreUtil.convertirObjetoLong(map.get("codigoMonto")));
			rar.setValorCliente(ModpreUtil.convertirObjetoBigDecimal(map.get("valorCliente")));
			rar.setScoreVinculado(ModpreUtil.convertirObjetoBigDecimal(map.get("scoreVinculado")));
			rar.setCodigoPlazo(ModpreUtil.convertirObjetoLong(map.get("codigoPlazo")));
			rar.setRar(ModpreUtil.convertirObjetoBigDecimal(map.get("rar_1")));
			rar.setTasaMinima(ModpreUtil.convertirObjetoBigDecimal(map.get("tasaMinima_1")));
			rar.setTasaMaxima(ModpreUtil.convertirObjetoBigDecimal(map.get("tasaMaxima_1")));
			rar.setTasaMinimaDelegada(ModpreUtil.convertirObjetoBigDecimal(map.get("tasaMinimaDelegada_1")));
			Valor tipoCarga = new Valor();
			tipoCarga.setNombre(ModpreUtil.convertirObjetoString(map.get("tipoCargaNombre")));
			rar.setTipoCarga(tipoCarga);
			Valor estado=new Valor();
			estado.setNombre(ModpreUtil.convertirObjetoString(map.get("estadoNombre")));
			rar.setEstado(estado);
			rar.setRarocPropuesto(ModpreUtil.convertirObjetoBigDecimal(map.get("rarocPropuesto_1")));
			
			if(rar.getCodigoRar()!=null){
				filtro.add(Restrictions.eq("codigoRar",rar.getCodigoRar()));
			}
			if(rar.getCodigoPlazo()!=null){
				filtro.add(Restrictions.eq("codigoPlazo",rar.getCodigoPlazo()));
			}
			if(rar.getCodigoMoneda()!=null){
				filtro.add(Restrictions.eq("codigoMoneda",rar.getCodigoMoneda()));
			}
			if(rar.getCodigoGrupoProducto()!=null){
				filtro.add(Restrictions.eq("codigoGrupoProducto",rar.getCodigoGrupoProducto()));
			}
			if(rar.getCodigoMonto()!=null){
				filtro.add(Restrictions.eq("codigoMonto",rar.getCodigoMonto()));
			}
			if(rar.getValorCliente()!=null){
				filtro.add(Restrictions.eq("valorCliente",rar.getValorCliente()));
			}
			if(rar.getScoreVinculado()!=null){
				filtro.add(Restrictions.eq("scoreVinculado",rar.getScoreVinculado()));
			}
			if(rar.getRarocPropuesto()!=null && ModpreUtil.convertirObjetoBigDecimal(map.get("rarocPropuesto_2"))!=null){
				filtro.add(Restrictions.between("rarocPropuesto",rar.getRarocPropuesto(),ModpreUtil.convertirObjetoBigDecimal(map.get("rarocPropuesto_2"))));
			}
			if(rar.getRar()!=null && ModpreUtil.convertirObjetoBigDecimal(map.get("rar_2"))!=null){
				filtro.add(Restrictions.between("rar",rar.getRar(),ModpreUtil.convertirObjetoBigDecimal(map.get("rar_2"))));
			}
			if(rar.getTasaMinima()!=null && ModpreUtil.convertirObjetoBigDecimal(map.get("tasaMinima_2"))!=null){
				filtro.add(Restrictions.between("tasaMinima",rar.getTasaMinima(),ModpreUtil.convertirObjetoBigDecimal(map.get("tasaMinima_2"))));
			}
			if(rar.getTasaMaxima()!=null && ModpreUtil.convertirObjetoBigDecimal(map.get("tasaMaxima_2"))!=null){
				filtro.add(Restrictions.between("tasaMaxima",rar.getTasaMaxima(),ModpreUtil.convertirObjetoBigDecimal(map.get("tasaMaxima_2"))));
			}
			if(rar.getTasaMinimaDelegada()!=null && ModpreUtil.convertirObjetoBigDecimal(map.get("tasaMinimaDelegada_2"))!=null){
				filtro.add(Restrictions.between("tasaMinimaDelegada",rar.getTasaMinimaDelegada(),ModpreUtil.convertirObjetoBigDecimal(map.get("tasaMinimaDelegada_2"))));
			}
			if(rar.getEstado()!=null){
				filtro.add(Restrictions.ilike("e.nombre",rar.getEstado().getNombre(), MatchMode.START));
			}
			if(rar.getTipoCarga()!=null){
				filtro.createAlias("tipoCarga", "t");
				filtro.add(Restrictions.ilike("t.nombre",rar.getTipoCarga().getNombre(), MatchMode.ANYWHERE));
			}
			
		}
		return buscar(filtro);
	}

	@Override
	public Rar obtenerRar(Rar rar) {
		Busqueda filtro = Busqueda.forClass(Rar.class);
		if(rar!=null){
			if(rar.getCodigoMoneda()!=null){
				filtro.add(Restrictions.eq("codigoMoneda",rar.getCodigoMoneda()));
			}
			if(rar.getCodigoGrupoProducto()!=null){
				filtro.add(Restrictions.eq("codigoGrupoProducto",rar.getCodigoGrupoProducto()));
			}
			if(rar.getValorCliente()!=null){
				filtro.add(Restrictions.eq("valorCliente",rar.getValorCliente()));
			}
			if(rar.getScoreVinculado()!=null){
				filtro.add(Restrictions.eq("scoreVinculado",rar.getScoreVinculado()));
			}
			if(rar.getCodigoMonto()!=null){
				filtro.add(Restrictions.eq("codigoMonto",rar.getCodigoMonto()));
			}
			if(rar.getCodigoPlazo()!=null){
				filtro.add(Restrictions.eq("codigoPlazo",rar.getCodigoPlazo()));
			}

			if(rar.getEstado()!=null){
				filtro.createAlias("estado", "e");
				filtro.add(Restrictions.eq("e.codigo",rar.getEstado().getCodigo()));
			}
			if(rar.getTipoCarga()!=null){
				if(rar.getTipoCarga().getCodigo()!=null){
					filtro.createAlias("tipoCarga", "t");
					filtro.add(Restrictions.eq("t.codigo",rar.getTipoCarga().getCodigo()));
				}
			}
		}
		return obtener(filtro);
	}

	@Override
	@Transactional
	public void actualizarRarEstado(String codigoEstado, Valor tipoCarga) {
		Valor estado=valorDAO.obtenerValorxCodigo(codigoEstado);
		Query q = getSession().createQuery("update Rar set estado = :codigoEstado where tipoCarga = :tipoCarga");
		q.setLong("codigoEstado", estado.getId());
		q.setLong("tipoCarga", tipoCarga.getId());
		q.executeUpdate();
	}
}
